package com.wpen.unit.infra.repository.system.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;

import java.io.Serializable;
import java.util.List;

import com.wpen.unit.infra.repository.system.UserRepository;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.wpen.unit.utils.StringUtil;
import com.wpen.unit.exception.UpdateZeroException;

import com.wpen.unit.infra.mybatis.system.mapper.UserMapper;
import com.wpen.unit.infra.mybatis.system.po.UserPo.UserColumns;
import com.wpen.unit.infra.mybatis.system.po.UserPo;

/**
 * 用户信息维护.
 * 
 * @author Wang Peng
 * @date 2022-12-23
 *
 */
@Repository
@Transactional
public class UserRepositoryImpl extends ServiceImpl<UserMapper, UserPo> implements UserRepository {

    @Override
    public UserPo queryByUserId(String userId) {
        QueryWrapper<UserPo> queryWrapper = Wrappers.query();
        queryWrapper.eq(UserColumns.USER_ID.name(), userId);
        return super.getOne(queryWrapper);
    }

    @Override
    public long count(UserPo userPo) {
        QueryWrapper<UserPo> queryWrapper = createQuery(userPo);
        return super.count(queryWrapper);
    }

    @Override
    public List<UserPo> queryList(int index, int size, UserPo userPo) {
        QueryWrapper<UserPo> queryWrapper = createQuery(userPo);
        if (size > 0) {
            Page<UserPo> page = new Page<>(index, size, false);
            return super.page(page, queryWrapper).getRecords();
        }
        // queryWrapper.orderBy(true, false, UserColumns.ID.name());
        return getBaseMapper().selectList(queryWrapper);
    }

    private QueryWrapper<UserPo> createQuery(UserPo userPo) {
        QueryWrapper<UserPo> queryWrapper = Wrappers.query();
        if (userPo.getId() != null) {
            queryWrapper.eq(UserColumns.ID.name(), userPo.getId());
        }
        if (StringUtil.isNotEmpty(userPo.getUserId())) {
            queryWrapper.eq(UserColumns.USER_ID.name(), userPo.getUserId());
        }
        if (StringUtil.isNotEmpty(userPo.getUserName())) {
            queryWrapper.eq(UserColumns.USER_NAME.name(), userPo.getUserName());
        }
        // if (StringUtil.isNotEmpty(userPo.getGender())) {
        // queryWrapper.eq(UserColumns.GENDER.name(), userPo.getGender());
        // }
        // if (StringUtil.isNotEmpty(userPo.getUserEmail())) {
        // queryWrapper.eq(UserColumns.USER_EMAIL.name(), userPo.getUserEmail());
        // }
        // if (StringUtil.isNotEmpty(userPo.getUserTelnum())) {
        // queryWrapper.eq(UserColumns.USER_TELNUM.name(), userPo.getUserTelnum());
        // }
        // if (StringUtil.isNotEmpty(userPo.getEnglishName())) {
        // queryWrapper.eq(UserColumns.ENGLISH_NAME.name(), userPo.getEnglishName());
        // }
        // if (StringUtil.isNotEmpty(userPo.getUserDesc())) {
        // queryWrapper.eq(UserColumns.USER_DESC.name(), userPo.getUserDesc());
        // }
        // if (StringUtil.isNotEmpty(userPo.getCreateTime())) {
        // queryWrapper.eq(UserColumns.CREATE_TIME.name(), userPo.getCreateTime());
        // }
        // if (StringUtil.isNotEmpty(userPo.getEndTime())) {
        // queryWrapper.eq(UserColumns.END_TIME.name(), userPo.getEndTime());
        // }
        if (StringUtil.isNotEmpty(userPo.getStatus())) {
            queryWrapper.eq(UserColumns.STATUS.name(), userPo.getStatus());
        }
        // if (userPo.getVersion() != null) {
        // queryWrapper.eq(UserColumns.VERSION.name(), userPo.getVersion());
        // }
        return queryWrapper;
    }

    @Override
    public UserPo queryFirst(UserPo userPo) {
        QueryWrapper<UserPo> queryWrapper = Wrappers.query();
        if (userPo.getId() != null) {
            queryWrapper.eq(UserColumns.ID.name(), userPo.getId());
        }
        if (StringUtil.isNotEmpty(userPo.getUserId())) {
            queryWrapper.eq(UserColumns.USER_ID.name(), userPo.getUserId());
        }
        if (StringUtil.isNotEmpty(userPo.getUserName())) {
            queryWrapper.eq(UserColumns.USER_NAME.name(), userPo.getUserName());
        }
        // if (StringUtil.isNotEmpty(userPo.getGender())) {
        // queryWrapper.eq(UserColumns.GENDER.name(), userPo.getGender());
        // }
        // if (StringUtil.isNotEmpty(userPo.getUserEmail())) {
        // queryWrapper.eq(UserColumns.USER_EMAIL.name(), userPo.getUserEmail());
        // }
        // if (StringUtil.isNotEmpty(userPo.getUserTelnum())) {
        // queryWrapper.eq(UserColumns.USER_TELNUM.name(), userPo.getUserTelnum());
        // }
        // if (StringUtil.isNotEmpty(userPo.getEnglishName())) {
        // queryWrapper.eq(UserColumns.ENGLISH_NAME.name(), userPo.getEnglishName());
        // }
        // if (StringUtil.isNotEmpty(userPo.getUserDesc())) {
        // queryWrapper.eq(UserColumns.USER_DESC.name(), userPo.getUserDesc());
        // }
        // if (StringUtil.isNotEmpty(userPo.getCreateTime())) {
        // queryWrapper.eq(UserColumns.CREATE_TIME.name(), userPo.getCreateTime());
        // }
        // if (StringUtil.isNotEmpty(userPo.getEndTime())) {
        // queryWrapper.eq(UserColumns.END_TIME.name(), userPo.getEndTime());
        // }
        if (StringUtil.isNotEmpty(userPo.getStatus())) {
            queryWrapper.eq(UserColumns.STATUS.name(), userPo.getStatus());
        }
        // if (userPo.getVersion() != null) {
        // queryWrapper.eq(UserColumns.VERSION.name(), userPo.getVersion());
        // }
        // queryWrapper.orderBy(true, false, UserPoColumns.ID.name());
        return super.getOne(queryWrapper);
    }

    @Override
    public UserPo queryById(Serializable id) {
        return super.getById(id);
    }

    @Override
    public boolean insert(UserPo userPo) {
        userPo.setVersion(1);
        userPo.setUpdateTime(new java.sql.Timestamp(System.currentTimeMillis()));
        return super.save(userPo);
    }

    @Override
    public boolean insertBatch(List<UserPo> listUserPos) {
        int rs = getBaseMapper().insertBatchSomeColumn(listUserPos);
        return SqlHelper.retBool(rs);
    }

    @Override
    public boolean updateById(UserPo userPo) {
        UpdateWrapper<UserPo> updateWrapper = Wrappers.update();
        updateWrapper.eq(UserColumns.ID.name(), userPo.getId());
        updateWrapper.eq(UserColumns.VERSION.name(), userPo.getVersion());
        userPo.setVersion(userPo.getVersion() + 1);
        boolean rs = super.update(userPo, updateWrapper);
        // 根据ID更新所有字段，空值也更新
        // int num = getBaseMapper().alwaysUpdateSomeColumnById(ucpBatchInfoPo);
        // boolean rs = SqlHelper.retBool(num);
        if (!rs) {
            throw new UpdateZeroException();
        }
        return rs;
    }

    @Override
    public boolean deleteByIds(Serializable[] ids) {
        UpdateWrapper<UserPo> updateWrapper = Wrappers.update();
        updateWrapper.in(UserColumns.ID.name(), (Object[]) ids);
        return super.remove(updateWrapper);
    }

//    public UserPo queryByExample(UserPo userPo) {
//        QueryWrapper<UserPo> queryWrapper = Wrappers.query();
//        if (userPo.getId() != null) {
//            queryWrapper.eq(UserColumns.ID.name(), userPo.getId());
//        }
//        if (StringUtil.isNotEmpty(userPo.getUserId())) {
//            queryWrapper.eq(UserColumns.USER_ID.name(), userPo.getUserId());
//        }
//        if (StringUtil.isNotEmpty(userPo.getUserName())) {
//            queryWrapper.eq(UserColumns.USER_NAME.name(), userPo.getUserName());
//        }
//        if (StringUtil.isNotEmpty(userPo.getGender())) {
//            queryWrapper.eq(UserColumns.GENDER.name(), userPo.getGender());
//        }
//        if (StringUtil.isNotEmpty(userPo.getUserEmail())) {
//            queryWrapper.eq(UserColumns.USER_EMAIL.name(), userPo.getUserEmail());
//        }
//        if (StringUtil.isNotEmpty(userPo.getUserTelnum())) {
//            queryWrapper.eq(UserColumns.USER_TELNUM.name(), userPo.getUserTelnum());
//        }
//        if (StringUtil.isNotEmpty(userPo.getEnglishName())) {
//            queryWrapper.eq(UserColumns.ENGLISH_NAME.name(), userPo.getEnglishName());
//        }
//        if (StringUtil.isNotEmpty(userPo.getUserDesc())) {
//            queryWrapper.eq(UserColumns.USER_DESC.name(), userPo.getUserDesc());
//        }
//        if (StringUtil.isNotEmpty(userPo.getCreateTime())) {
//            queryWrapper.eq(UserColumns.CREATE_TIME.name(), userPo.getCreateTime());
//        }
//        if (StringUtil.isNotEmpty(userPo.getEndTime())) {
//            queryWrapper.eq(UserColumns.END_TIME.name(), userPo.getEndTime());
//        }
//        if (StringUtil.isNotEmpty(userPo.getStatus())) {
//            queryWrapper.eq(UserColumns.STATUS.name(), userPo.getStatus());
//        }
//        if (userPo.getVersion() != null) {
//            queryWrapper.eq(UserColumns.VERSION.name(), userPo.getVersion());
//        }
//		Page<UserPo> page = new Page<>(0, 1, false);
//		queryWrapper.orderBy(true, false, UserPoColumns.ID.name());
//    }

}
